package com.juani.test.portlet;

import java.io.IOException;
import java.util.Date;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletException;
import javax.portlet.ProcessAction;

import com.juani.test.NoSuchClientException;
import com.juani.test.model.Client;
import com.juani.test.service.ClientLocalServiceUtil;
import com.liferay.counter.service.CounterLocalServiceUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.servlet.SessionMessages;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.model.User;
import com.liferay.portal.service.UserLocalServiceUtil;
import com.liferay.portal.theme.ThemeDisplay;
import com.liferay.util.bridges.mvc.MVCPortlet;


/**
 * Portlet ABM de clientes.
 */
public class ClientPortlet extends MVCPortlet {

	private static Log _log = LogFactoryUtil.getLog(ClientPortlet.class);

	@ProcessAction(name="edit")
	public void edit(ActionRequest actionRequest,
			ActionResponse actionResponse) throws IOException, PortletException {

		long clientId = ParamUtil.getLong(actionRequest, "clientId", -1);
		if(clientId != -1) {
			try {
				_log.info("Getting clientId " + clientId);
				Client client = ClientLocalServiceUtil.getClient(clientId);
				actionRequest.setAttribute("client", client);
				actionRequest.setAttribute("clientId", client.getClientId());
			} catch (NoSuchClientException e) {
				SessionErrors.add(actionRequest, "no-such-client");
			} catch (Exception e) {
				SessionErrors.add(actionRequest, "unknow-error");
				_log.error("Unknow error getting clientId " + clientId, e);
			}
		} else {
			// Si no existe parámetro clientId, entonces es edición de
			// nuevo registro cliente
			_log.info("Redirect to new client view");
		}

		if(SessionErrors.isEmpty(actionRequest)) {
			// Si no se produjeron errores redirijo a vista de edición cliente
			actionResponse.setRenderParameter("jspPage", "/html/client/edit.jsp");
		} else {
			// Si se produjeron errores redirijo al listado donde se mostrarán los errores
			actionResponse.setRenderParameter("jspPage", "/html/client/view.jsp");
		}
	}

	@ProcessAction(name="save")
	public void save(ActionRequest actionRequest,
			ActionResponse actionResponse) throws IOException, PortalException, SystemException {

		// El objeto themeDisplay nos da información global util
		ThemeDisplay themeDisplay = (ThemeDisplay) actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
		// Usuario logeado
		User user = UserLocalServiceUtil.getUser(themeDisplay.getUserId());

		long clientId = ParamUtil.getLong(actionRequest, "clientId", -1);
		Client client = null;
		if(clientId != -1) {
			_log.info("Saving clientId " + clientId);
			try {
				// Obtenemos el cliente a editar
				client = ClientLocalServiceUtil.getClient(clientId);

				// Seteamos los campos de auditoría
				client.setModifiedDate(new Date());
			} catch (NoSuchClientException e) {
				SessionErrors.add(actionRequest, "no-such-client");
			} catch (Exception e) {
				SessionErrors.add(actionRequest, "unknow-error");
				_log.error("Unknow error getting clientId " + clientId, e);
			}
		} else {
			_log.info("Adding new client");
			// En liferay un nuevo objecto se crea con XXXLocalServiceUtil.createXXX,
			// ya que el modelo (en este caso "Client"), es una interfaz, y
			// la implementación la meneja LR
			client = ClientLocalServiceUtil.createClient(CounterLocalServiceUtil.increment());

			// Seteamos los campos de auditoría
			client.setCreateDate(new Date());
			client.setUserId(user.getUserId());
			client.setUserName(user.getScreenName());
			client.setCompanyId(user.getCompanyId());
		}

		// Seteamos los valores obtenidos del form en el objeto client
		client.setFirstName(actionRequest.getParameter("firstName"));
		client.setLastName(actionRequest.getParameter("lastName"));
		client.setEmail(actionRequest.getParameter("email"));
		client.setAddress(actionRequest.getParameter("address"));
		client.setPhone(actionRequest.getParameter("phone"));
		client.setMovil(actionRequest.getParameter("movil"));


		// Hacemos algunas validaciones antes de guardar los cambios
		if(Validator.isNull(client.getFirstName()) || Validator.isNull(client.getLastName())) {
			SessionErrors.add(actionRequest, "client-null-name");
		}

		// Si no hubo errores de validación guardamos
		if(SessionErrors.isEmpty(actionRequest)) {
			try {
				// Guardamos el nuevo cliente o el cliente existente con los cambios
				ClientLocalServiceUtil.updateClient(client, true);
			} catch(Exception e) {
				SessionErrors.add(actionRequest, "unknow-error");
				_log.error("Unknow error saving client", e);
			}
		}

		if(SessionErrors.isEmpty(actionRequest)) {
			// Si no se produjeron errores redirijo a listado de cliente
			actionResponse.setRenderParameter("jspPage", "/html/client/view.jsp");
		} else {
			// Si se produjeron errores redirijo al mismo JSP para que se corrigan campos,
			// El campo clientId es vuelto a escribir en el contexto ya que es campo hidden
			// y cuando se reenvía un form el valor "se borra"
			actionRequest.setAttribute("clientId", actionRequest.getParameter("clientId"));
			actionResponse.setRenderParameter("jspPage", "/html/client/edit.jsp");
		}
	}
	
	@ProcessAction(name="delete")
	public void delete(ActionRequest actionRequest,
			ActionResponse actionResponse) throws IOException, PortletException {

		long clientId = ParamUtil.getLong(actionRequest, "clientId", -1);
		
		if(clientId != -1) {
			Client client = null;
			try {
				client = ClientLocalServiceUtil.getClient(clientId);
				_log.info("Getting clientId " + clientId);
				ClientLocalServiceUtil.deleteClient(client.getClientId());
				
			} catch (NoSuchClientException e) {
				SessionErrors.add(actionRequest, "no-such-client");
			} catch (Exception e) {
				SessionErrors.add(actionRequest, "unknow-error");
				_log.error("Unknow error getting clientId " + clientId, e);
			}
		} 
		if(SessionErrors.isEmpty(actionRequest)) {
			SessionMessages.add(actionRequest, "deleted-client");
			actionResponse.setRenderParameter("jspPage", "/html/client/view.jsp");
		} 
	}
}
